/**
 * 使用 set 去重
 * @param {*} nums 
 * @returns 
 */
// var threeSum = function(nums) {
//     let n = nums.length
//     if(n<3) return []
//     nums.sort((a,b)=>a-b)
//     let s =new Set()
   

//     for(let i=0;i<n-2;i++){
//         if(nums[i]>0) break
//         let r = n-1,
//             l = i+1
//         while(r>l){
//             let sum =nums[i] + nums[l] +nums[r]
//             if(sum>0) {r--;continue}
//             if(sum<0) {l++;continue}
//             s.add(`${nums[i]},${nums[l]},${nums[r]}`)
//             l++
//             r--
//         }
//     }
//     return Array.from(s).map(i=>i.split(','))
// };

//console.log(threeSum([-1,0,1,2,-1,-4]));
/**
 * 不使用set去重
 * @param {*} nums 
 * @returns 
 */

var threeSum = function(nums) {
    let n = nums.length
    if(n<3) return []
    nums.sort((a,b)=>a-b)
    let res = []
    for(let i=0;i<n-2;i++){
        if(nums[i]>0) break
        //a 去重
        if(i>0&&nums[i]==nums[i-1]) continue;
        let r = n-1,
            l = i+1
        while(r>l){
            let sum =nums[i] + nums[l] +nums[r]
            if(sum>0) {r--;continue}
            if(sum<0) {l++;continue}
            res.push([nums[i],nums[l],nums[r]])
            //b 去重
            while(l<r&&nums[l]===nums[++l]);
            while(l<r&&nums[r]===nums[--r]);
        }
    }
    return res
};

console.log(threeSum([0,0,0,0]));

